package services;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import repositories.IncidenciaRepository;
import domain.ComunidadDeVecinos;
import domain.Incidencia;
import domain.Presupuesto;
import domain.Vecino;

@Transactional
@Service
public class IncidenciaService {

	@Autowired
	private IncidenciaRepository incidenciaRepository;

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	@Autowired
	private VecinoService VecinoService;

	@Autowired
	private PresupuestoService presupuestoService;

	public IncidenciaService() {
		super();
	}

	public Incidencia create(int comunidadId) {
		Incidencia res;
		ComunidadDeVecinos comunidad;
		Vecino principal;

		comunidad = comunidadDeVecinosService.findOne(comunidadId);
		principal = VecinoService.findByPrincipal();

		Assert.isTrue(principal.equals(comunidad.getPresidente()));
		res = new Incidencia();

		res.setComunidadDeVecinos(comunidad);
		res.setEstado("Pendiente de presupuesto");
		res.setFecha(new Date(System.currentTimeMillis()-1000));
		res.setPresupuestos(new HashSet<Presupuesto>());

		return res;

	}

	public void save(Incidencia incidencia) {
		Vecino principal;
		ComunidadDeVecinos comunidad;

		Assert.notNull(incidencia);

		comunidad = incidencia.getComunidadDeVecinos();
		principal = VecinoService.findByPrincipal();
		Assert.isTrue(incidencia.getFecha().before(new Date()));
		Assert.isTrue(principal.equals(comunidad.getPresidente()));

		if (incidencia.getId() == 0) {
			Assert.isTrue(incidencia.getEstado().equals(
					"Pendiente de presupuesto"));
		} else {
			Assert.isTrue(incidencia.getEstado().equals("Tramitada"));

		}
		if (!incidencia.getPresupuestos().isEmpty()) {
			Assert.isTrue(incidencia.getPresupuestos().size() == 1);
			List<Presupuesto> lAux;
			lAux = (List<Presupuesto>) incidencia.getPresupuestos();
			lAux.get(0).getEstado().equals("Aceptado");
		}
		incidenciaRepository.save(incidencia);
	}

	public void delete(Incidencia inc) {
		Assert.notNull(inc);
		incidenciaRepository.delete(inc);
	}

	public Collection<Incidencia> findByComunidad(int comunidadId) {

		Collection<Incidencia> res;

		res = incidenciaRepository.findByComunidad(comunidadId);
		return res;
	}

	public Incidencia findOne(int incidenciaId) {
		Incidencia res;
		res = incidenciaRepository.findOne(incidenciaId);
		Assert.notNull(res);
		return res;
	}

	public void asignarPresupuesto(Incidencia incidencia, int presupuestoId) {
		Assert.notNull(incidencia);
		Presupuesto presupuesto;
		Collection<Presupuesto> presupuestos;
		Assert.isTrue(incidencia.getPresupuestos().isEmpty()
				|| incidencia.getPresupuestos() == null);

		presupuestos = new ArrayList<Presupuesto>();
		presupuesto = presupuestoService.findOne(presupuestoId);

		Assert.isTrue(presupuesto.getEstado().equals("Aceptado")
				|| presupuesto.getEstado().equals("Pendiente"));
		presupuestos.add(presupuesto);
		presupuesto.setIncidencia(incidencia);
		presupuestoService.save(presupuesto);
		incidencia.setPresupuestos(presupuestos);
		incidencia.setEstado("Tramitada");
		save(incidencia);

	}
}
